//初始情况下有多少个节点就有多少个连通分支
#include<iostream>
using namespace std;
static int T=10000;
int n=6;//节点个数
int c[6][6]={
  {0,6,1,5,T,T},
  {6,0,5,T,3,T},
  {1,5,0,5,6,4},
  {5,T,5,0,T,2},
  {T,3,6,T,0,6},
  {T,T,4,2,6,0}
};
int v[6][6];//有6个连通分支初始状态每个连通分支是一个孤立的点
int s[6][6];
int cloest[6];
//查找顶点a,b是否属于同一连通分支
int find(int a,int b){
  for(int i=0;i<n;i++){
    if(v[i][0]==1)
     if(v[i][a]==1&&v[i][b]==1) return 1;
  }
  return 0;
}
void combine(int a,int b){
  for(int i=0;i<n;i++){
    if(v[b][i]==1) v[a][b]=1;
  }
  v[b][0]=0;//消除分支b
  cout<<"combine fz:"<<a<<","<<b<<"   ";
  for(int i=0;i<n;i++) cout<<v[a][i]<<" ";
  cout<<endl<<endl;
}

 void kruskal(){
   for(int i=0;i<n;i++) v[i][0]=1;//初始化每一个连通分支
   for(int count=0;count<n;count++){
     int Min=T;
     int a=0;int b=0;//最小边集的两定顶点
     //找到一个最小的边
     for(int r=0;r<n;r++){
       for(int j=r+1;j<n;j++){
         if(s[r][j]!=1&&c[r][j]<Min){
           Min=c[r][j];
           a=r;b=j;
         }
       }
     }
     cout<<"Min="<<Min<<" "<<"a="<<a<<" "<<"b="<<b<<endl;
     if(find(a,b)==0){
       combine(a,b);//将b节点加入到a分支中
       cloest[b]=a;
       s[a][b]=1;
       v[a][b]=1;
     }
   }

 }

 int main(){
   kruskal();
   for(int i=1;i<n;i++){
     cout<<"cloest["<<i<<"]"<<"="<<cloest[i]<<endl;
   }
   return 0;
 }
